package com.lekang.system.service;

import java.util.List;
import java.util.Map;
import java.util.Date;
import com.lekang.system.domain.TaskArrangement;

/**
 * 任务安排Service接口
 *
 * @author zhihao
 * @date 2025-10-14
 */
public interface ITaskArrangementService
{
    /**
     * 查询任务安排
     * 
     * @param id 任务安排主键
     * @return 任务安排
     */
    public Map<String, Object> selectTaskArrangementById(Long id);

    /**
     * 查询任务安排列表
     *
     * @param taskArrangement 任务安排
     * @return 任务安排
     */
    public List<TaskArrangement> selectTaskArrangementList(TaskArrangement taskArrangement);

    /**
     * 多表联查任务安排列表
     *
     * @param params 查询参数
     * @return 任务安排列表
     */
    public List<Map<String, Object>> selectTaskArrangementJoinList(Map<String, Object> params);

    /**
     * 新增任务安排
     *
     * @param taskArrangement 任务安排
     * @return 结果
     */
    public int insertTaskArrangement(TaskArrangement taskArrangement);

    /**
     * 修改任务安排
     *
     * @param taskArrangement 任务安排
     * @return 结果
     */
    public int updateTaskArrangement(TaskArrangement taskArrangement);

    /**
     * 批量删除任务安排
     *
     * @param ids 需要删除的任务安排主键
     * @return 结果
     */
    public int deleteTaskArrangementByIds(Long[] ids);

    /**
     * 删除任务安排信息
     *
     * @param id 任务安排主键
     * @return 结果
     */
    public int deleteTaskArrangementById(Long id);


    /**
     * 查询任务安排详情
     * @param id 任务安排ID
     * @return 任务安排详情
     */
    Map<String, Object> selectTaskArrangementDetail(Long id);

    /**
     * 根据状态查询任务安排列表
     *
     * @param params 查询参数
     * @return 任务安排列表
     */
    List<Map<String, Object>> selectTaskArrangementByStatus(Map<String, Object> params);

    /**
     * PC端：今日待执行任务列表
     */
    List<Map<String, Object>> selectPcTodayPending(Map<String, Object> params);

    /**
     * 取消任务
     *
     * @param params 取消参数
     * @return 结果
     */
    int cancelTask(Map<String, Object> params);

    /**
     * 执行任务
     *
     * @param params 执行参数
     * @return 结果
     */
    int executeTask(Map<String, Object> params);

    /**
     * 改期任务
     *
     * @param params 改期参数
     * @return 结果
     */
    int rescheduleTask(Map<String, Object> params);

    /**
     * 查询护理项目列表（用于搜索）
     *
     * @param params 查询参数
     * @return 护理项目列表
     */
    List<Map<String, Object>> selectNursingProjectsForSearch(Map<String, Object> params);

    /**
     * 生成护理计划内任务
     *
     * @param params 生成参数
     * @return 结果
     */
    int generateNursingPlanTasks(Map<String, Object> params);

    /**
     * 生成护理计划外任务
     *
     * @param params 生成参数
     * @return 结果
     */
    int generateNonNursingPlanTasks(Map<String, Object> params);

    /**
     * 根据执行周期生成任务
     *
     * @param elderlyId 老人ID
     * @param nursingItemId 护理项目ID
     * @param executionCycleType 执行周期类型
     * @param executionFrequency 执行频率
     * @param plannedStartTime 计划执行开始时间
     * @param projectType 项目类型
     * @return 结果
     */
    int generateTasksByCycle(Long elderlyId, Long nursingItemId, String executionCycleType, 
                           Integer executionFrequency, Date plannedStartTime, String projectType);

    /**
     * 刷新未执行任务，隐藏已退住老人的任务
     */
    void refreshUnexecutedTasks();

    /**
     * 生成当月护理计划内任务
     *
     * @param monthStart 月初日期
     * @param monthEnd 月末日期
     */
    void generateMonthlyInPlanTasks(java.time.LocalDate monthStart, java.time.LocalDate monthEnd);

    /**
     * 生成入住首月护理计划内任务
     *
     * @param elderlyId 老人ID
     * @param checkInDate 入住日期
     * @param firstMonthEnd 首月结束日期
     */
    void generateFirstMonthInPlanTasks(Long elderlyId, java.time.LocalDate checkInDate, java.time.LocalDate firstMonthEnd);

    /**
     * 生成护理计划外任务
     *
     * @param elderlyId 老人ID
     * @param nursingItemId 护理项目ID
     * @param serviceTime 服务时间
     * @param orderNo 订单号
     */
    void generateOutOfPlanTask(Long elderlyId, Long nursingItemId, java.time.LocalDateTime serviceTime, String orderNo);
}